مهندسي معکوس در نرم افزار


 

نوشته: کيانوش باقري نوع پرست-کارشناس ارشد مهندسي نرم افزار کامپيوتر-دانشگاه آزاد اسلامي واحد گرمسار




 

مقدمه
 

عبارت «مهندسي معکوس»از مفاهيم سخت افزاري گرفته شده است که طي آن يک سازمان سخت افزاري، سخت افزار توليد شده توسط شرکت رقيب را خريداري مي کند تا با تجزيه آن به رازهاي ساخت آن دست پيدا مي کند.اين رازها هنگامي که طراحي رقيب و خصوصيات ساخت آن به دست آيد، برملا مي شود. اما اين مستندات براي شرکت هاي رقيب قابل دسترسي نيستند. مهندسي معکوس به وسيله آزمايش خصوصيات يک محصول، يک يا چند خاصيت طراحي آن را به دست مي آورد.
مهندسي معکوس در حيطه نرم افزار نيز همان خصوصيات را دارد. در بيشتر موارد برنامه اي که بايد مهندسي معکوس شود، متعلق به رقيب نيست،بلکه از کارهاي چند سال همان شرکت است که احتياج به رسيدگي پيدا کرده است.رازهايي که بايد کشف شوند هنوز معلوم نيستند، زيرا هيچ بخشي از نرم افزار قابل دسترسي نيست. بنابراين کار مهندسي معکوس درباره برنامه، بازگرداندن آن به سطح بالاتر از برنامه به زبان مبدأ آن است.
همانطور که گفته شد مهندسي معکوس يا به اختصارRE زير مجموعه مهندسي مجدد است و تعاريف گوناگوني از آن شده است که به برخي از آنها اشاره مي کنيم.
مهندسي معکوس، يافتن فرآيند ترميم طراحي است که ابزارهايش اطلاعات، معماري و ساختار زير برنامه اي نرم افزار موجود را به دست مي آورند. مهندسي معکوس به معني پروسه اي است که يک مبناي کاربرد مکانيکي دارد که ساختار خودش، توابع و عملکرد آنها را آناليز و طراحي مي کند. ديگر آنکه پروسه اي براي فهميدن يک سيستم و نيز شناختن نحوه کار توابع داخلي آن است. مهندسي معکوس روش توانمندي براي تشريح يک سيستم نرم افزاري است.
برخي اوقات به مهندسي معکوس، معکوس بودن(Reversing)اطلاق مي شود که در حقيقت از هم باز کردن پيچيدگي نرم افزار است. مهندسي معکوس فرآيند تجزيه و تحليل اجزاء سيستم هاي مربوط مي باشد که براي تشخيص مؤلفه ها و ارتباطات بين آنها و ايجاد نمايش سيستم در ساير فرم ها يا در سطح بالايي از انتزاع به ارث مي رسد. علاوه بر آن در اختيار گرفتن ارتباطات تکنيکي و تعامل بين اطلاعات و قوانين داراي کاربردهاي تجاري مي باشد که براي طراحي، بسيار مناسب و مفيد هستند. اهداف کليدي و اساسي در مهندسي معکوس، توليد ديدگاه هاي ديگر، بازيابي اطلاعات گم شده، آشکار سازي تأثيرات جانبي و ترکيب قسمت هاي مجزاي بالايي و سهولت در استفاده مجدد است. تأثير گذاري اين پروسه بر روي پروژه مهندسي معکوس بسيار مفيد و مؤثر است. مهندسي معکوس داراي تغييراتي در سيستم هاي مختلف است که باعث خلق و ايجاد سيستم هاي جديد مي شوند و همه اين سيستم هاي جديد نيز خود داراي عملکرد ويژه اي مي باشند.
چه خوب بود که مهندسي معکوس همان جعبه جادويي اي بود که از يک سر آن ليست درهم ريخته و بدون توضيح يک برنامه را وارد مي کرديم و از سر ديگر جعبه برنامه را با مستندات کامل تحويل مي گرفتيم. متأسفانه اين جعبه جادويي وجود خارجي ندارد. مهندسي معکوس مي تواند اطلاعات طراحي را از دل اصل برنامه بيرون بکشد، اما دراين ميان، درجه درستي اطلاعات، ميزان کامل بودن توضيحات، تعداد نيرو هاي انساني و ابزارها وخط سير نگهداشت، از برنامه اي با برنامه ديگر بسيار تفاوت دارد.
سطح انتزاع اطلاعات به دست آمده از فرآيند مهندسي معکوس و ابزارهايي که بر آن تأثير مي گذارند، به درجه پيشرفته بودن اطلاعات طراحي به دست آمده مربوط مي شود. حالت ايده آل اين موضوع آن است که سطح انتزاع اطلاعات در حد اعلا باشد، يعني مهندسي معکوس بتواند طراحي زير برنامه اي نرم افزار (نزديکترين سطح به زبان ماشين)، اصل برنامه و ساختمان داده ها(با سطح کمتر از انتزاع اطلاعات)، مدل هاي جريان اطلاعات(سطح نسبتاً بالاي انتزاع)و مدل هاي ارتباط داده اي را به دست آورد. هر چه در سطح انتزاع اطلاعات بالاتر رود، اطلاعاتي دراختيار مهندس نرم افزار قرار مي گيرد که کار فهميدن برنامه را براي او ساده تر مي کند.
درجه کامل بودن يک فرآيند مهندسي معکوس به معناي سطح جزئيات ارائه شده توسط يک سطح انتزاع مشخص است. در بسياري از موارد، کامل بودن نرم افزار با سطح انتزاع نسبت عکس دارد. به عنوان مثال، هنگامي که اصل يک برنامه در دسترس هست، راحت تر مي توان طراحي زير برنامه اي آن را به دست آورد. جريا ن هاي ساده اطلاعات را نيز مي توان به دست آورد، اما کار يافتن نمودارهاي کامل جريان اطلاعات، کاري مشکل خواهد بود.
درجه کامل بودن با مقدار تحليل هاي انجام شده، نسبت مستقيم دارد. اين موضوع همچنين به مقدار هماهنگي بين فرد و ابزارهاي خود کار مهندسي معکوس وابسته است. در بسياري از موارد با بالا رفتن سطح خلوص، بايد هماهنگي فرد-ابزار هم افزايش پيدا کند، در غير اين صورت درجه کامل بودن، کاهش پيدا خواهد کرد.
اگر جهت گيري فرآيند مهندسي معکوس يکسويه باشد، همه اطلاعات به دست آمده از نرم افزار، در اختيار مهندس نرم افزار قرار مي گيرد تا آن را در نگهداشت ديگر به کار گيرد. اگر جهت گيري دو سويه باشد، علاوه بر مهندسي معکوس، منجر به شيوه هاي مهندسي مجدد نيز خواهد شد که توسط آن مي نوان يک برنامه قديمي را دوباره توليد کرد.
ايده مهندسي معکوس ما را در مقابل گزينه هاي ي قرار مي دهد که عبارتند از:
1-ساختار برنامه چگونه است و منطق آن چطور ساخته شده است.
2-ما را به اين سمت هدايت مي کند که عملکرد برنامه چگونه است.
3-براي بهره برداري از نرم افزار خوب و مفيد است.
اگر بخواهيم مزاياي اصلي مهندسي معکوس را در قالبي دسته بندي کنيم، از اين قرار هستند:
1-براي فهميدن عماکرد سيستم يک برنامه به کار مي رود.
2-براي پي بردن به سوابق برنامه هاي قابل دسترس مورد استفاده قرار مي گيرد.
3-پروتکل را با نرم افزار مورد نظر به کار مي برد و ساير قسمت هاي شبکه را مطلع مي سازد.
مهندسي معکوس با محصول نهايي شروع مي کند و مفهوم مهندسي را با تجزيه ساختار سيستم و به دست آوردن رابطه بين مؤلفه هاي آن دوباره زنده مي کند. در حقيقت با مستندسازي بهتري که ارائه مي دهد، نشان مي دهد محصول واقعي براساس طرح اصلي چگونه کار مي کند. آن نه تنها براي چک کردن مسير کار استفاده مي شود، بلکه براي چک نمودن موارد مختلف ديگري نيز به کار مي رود که در زير به آنها اشاره مي کنيم:
1-به کمک يک نتيجه گيري ساده؛ به طور کامل بفهمد که محصول چگونه کار مي کند.
2-برنامه موجود را آزمايش مي کند و اشتباهات و محدوديت هارا بررسي مي نمايد.
3-سيستم و محصول بايد سازگار باشند، بنابراين آنها مي توانند داده ها را به اشتراک بگذارند.
4-به محدوديت محصول خودش پي مي برد.
5-آن محصول را چک مي کند تا اينکه کپي ديگري از تکنولوژي خودش باشد.
6-بدون اعتنا به درخواست سرويس مشتري، مستندات عملکرد محصول را ايجاد مي کند.
7-محصول قديمي را با آداپته کردن آنهابا سيستم جديد و چارچوبي متفاوت، به روز رساني مي کند.

فرآيند مهندسي معکوس
 

فرآيند مهندسي معکوس در شکل 1 نشان داده شده است که به وسيله استخراج نيازمندي ها و درخواست ها وجزءبه جزء کردن اطلاعات طراحي از کد منبع و مستندات موجود شروع مي شود.بخش بندي يا جدا سازي کد، روشي است براي مشتق شدن از يک برنامه که قسمت هاي ديگر را تحت تأثير قرار مي دهد و اين به معني کمترين مقدار داده ها و کد است که مي تواند داده هاي مورد نياز را براي طراحي برنامه مورد نظر در دسترس قرار دهد.
تعاريف داده ها و جريان کنترلي به درخواست مقادير عناصر داده اي بخش هاي مختلف کمک مي کنند و هر چيزي را که به آن کمک نمي کند دور مي ريزند. هدف اصلي،محاسبه عملکردهاي بخش هاي فرعي است، بنابراين اين ارزيابي بخش هاي مجزا از هم بسيار دشوار است.
سه روش بخش بندي و جدا سازي وجود دارد: شرايط پايه، شرايط رو به جلو، و شرايط رو به عقب.
جدا سازي براساس شرايط پايه در واقع نوعي عملکرد تجاري مي باشد که مي تواند تحت شرايط مختلف مورد آزمايش قرار گيرد. اين روش بخش بندي براي برنامه ها وبخش هاي کلي و يا شرايط خاص و براي بيان منطقي دامنه بخش بندي يعني از کجا شروع شده و به کجا ختم مي شود، به کار برده مي شود و بسيار مفيد است. همه برنامه هاي قابل دسترسي مي توانند تحت اين جريان کنترلي درآيند و در بخش هاي مختلف نيز مورد استفاده قرار گيرند.
بخش بندي رو به جلو براي کاربردهايي استفاده مي شود که به طور عادي ورودي پروسه را ارزيابي مي کنند.هدف از اين متد، پيدا کردن و يافتن محدوده اي از کدهاست که بستگي به ارزيابي متغيرهاي ورودي دارد. ونيز داراي تأثيرات کاربردي فراواني مي باشند، که اين تأثيرات کاربردي فراواني مي باشند، که اين تأثيرات با توجه به محدوده بخش، متغير است و گزارشات در اين محدوده مي توانند به شکل بالقوه اي از متغير تعريف شده تأثير پذير باشند.گزارشات(Statements)مي توانند در مورد جريان داده، وابستگي کنترل، و يا پروسه بازگشتي تأثير گذار باشند. در بخش رو به جلو، پروسه با نتايج برنامه موجود شروع مي کند.محدوده اي از کدها که بر مقادير متغيرهاي خروجي تأثير دارند، قسمتي از بخش بندي هستند. بامتغيرو محدوده داده شده، اين روش از بخش بندي، گزارشاتي را که مي توانند بطور بالقوه روي مقدار متغير تأثير گذار باشند، برمي گرداند. ابزارهايي نيز براي تجهيزات بخش بندي قابل دسترسي مي باشند، ولي انجام اين فرآيند با استفاده از ابزار وقت گير و بسيار دشوار است.

مراحل مهندسي معکوس
 

همانطور که مي دانيم جريان مهندسي معکوس خيلي وقت گير و گرانقيمت است. عموماًبررسي دقيق، مانند سعي براي خريد يا مجوز داشتن اطلاعات توليد واقعي ريسک مالي دارد، بنابراين براي يک محصول يا مؤلفه مهندسي، سيستم مراحل زير به ترتيب بايد طي شود:
1-بازبيني و شناختن محصول يا مؤلفه سيستم که مهندسي معکوس خواهد بود، در حقيقت تصميم مي گيرد محصول انتخابي براي طرح و پروژه آنها کدام باشد. طرح شامل آيتم هاي منحصر به فرد، قسمت ها و نيز مؤلفه ها و برخي از قسمت ها را شامل مي شود که ممکن است تعداد زيادي از قسمت ها را به عنوان يک موجوديت واحد ارائه دهد.
مستندات اطلاعاتي را که ممکن است چگونگي کارکرد محصول واقعي را چک کنند، مورد مطالعه دقيق قرار داده و پياده سازي مي کند، در واقع با جمع آوري تمام داده هاي تخصصي ودستور العمل ها، توصيف سيستم را مي سازد. مهندسي معکوس محصول اصلي را به برنامه زبان اسمبلي تبديل مي کند و در واقع عمل دي اسمبل (Disassemble)را انجام مي دهد. بعد آن راعمل دي کامپايل(Decompile)به زبان سطح بالا يا به عبارتي زبان مبدأ تبديل مي کند.
داده هاي تخصصي را که توسط مهندسي معکوس در يک نگارش تعديل شده از محصول واقعي توليد شده است، به کار مي برد. با اين کار هنگام اجرا داده ها را وارسي مي کند. آنها دقت و اعتبار طرحي را که الگوي اوليه تهيه شده است، مورد بررسي و آزمايش قرار مي دهند و ميزان صحت و سقم آن را مي سنجند.
و در نهايت مهندسي معکوس، محصول جديد را به بازار معرفي و عرضه مي کند. اين محصول با طرح هاي تکميلي، ويژگي ها و قابليت هايش تفاوت زيادي با محصول واقعي يا به عبارتي اوليه دارد. البته اين محصول جديد جهت استفاده در ساير سيستم هاي يکپارچه همانند چارچوب متفاوتي از سيستم عامل، ممکن است با محصول واقعي منطبق باشد. در حقيقت اين نوع مهندسي همان کارايي را به شيوه اي متفاوت ايجاد مي کند.
مراحل مهندسي معکوس را به شکل گوناگوني ترسيم نموده اند. برخي آن را به چهار مرحله:پياده سازي،طراحي، درخواست يا نياز و مفهوم تقسيم بندي مي کنند. گروهي آن را در چهار مرحله: پياده سازي، طراحي، آناليز و درخواست جاي مي دهند که در شکل 2 شماي گرافيکي آن آمده است. البته با توجه به بررسي هاي انجام شده روي مقالات گوناگون مي توان اين گونه نتيجه گرفت که مرحله درخواست در حال اول شامل آناليز هم مي باشد.

مهندسي معکوس مناسب
 

مهندسي معکوس مناسب يک روش قوي براي درک يک سيستم نرم افزار است.در اينجااين سؤال مطرح مي شود که چگونه مي دانيم که عملکرد مهندسي معکوس، برنامه اي را به طور مناسب ارائه مي دهد؟ پاسخ اين است؛ برنامه اي که توسط مهندسي معکوس ارائه مي شود اگر کامل و صحيح باشد، مناسب خواهد بود و يک ابزار خودکار مي تواند برنامه اي را برابر اصل آن ايجاد کند.
ما از دو ديدگاه اصلي براي ايجاد آن استفاده مي کنيم. اولي از بررسي ايده معکوس کردن فرآيند مهندسي حاصل مي شود، يعني در نطر گرفتن تصويري که حاصل از مهندسي معکوس است و استفاده از آن در بازسازي مجدد يک برنامه. براي کاهش تنوع وعدم اطمينان در اين فرآيند مي خواهيم که بازسازي بطور خودکار صورت گيرد.اگر بتوانيم دو کار ارائه و ايجاد را با هم انجام دهيم، داراي ابزار عملي براي شناسايي تماميت تلاش خود خواهيم بود. ديدگاه دوم کيفيت ارائه را در نظر مي گيرد؛ يعني چگونه تضمين مي دهيم که اين ارائه بينش مفيدي را در برنامه فراهم کند؟ در اينجا مدلي از دامنه کاربرد برنامه را همچون استاندارد خارجي براي مقايسه ارائه به کار گرفتيم. يک مدل دامنه، مجموعه اي از انتظارات موجود در ساخت يک برنامه و چگونگي ارتباط آنها با يکديگر را فراهم مي سازد. هنگام مهندسي معکوس يک برنامه، مقايسه نتايج حاصله از طريق مدل دامنه، به ارائه دقيق برنامه کمک مي کند.
نقش يک مهندس معکوس درک يک برنامه و بيان مکانيزم ارائه است. براي انجام آن، مهندس معکوس بايد دو نوع پرسش را پاسخ دهد: سؤال هاي «چيست»و سؤال هاي چگونه». سؤال هاي «چيست»بر اهداف و نيازمندي هاي برنامه متمرکز مي شود، در حالي که سؤال هاي «چگونه»بر مقاصد طرح که توسط توسعه دهندگان اصلي ايجاد شده اند و اينکه چگونه اين مقاصد در کد نشان داده مي شوند، متمرکز است.مناسب بودن ارائه و نمايش، بيانگرميزان اطلاعات «چيست»و «چگونه»است.
تناسب مي تواند از نظر بروني و دروني مورد ارزيابي قرار گيرد. معياربروني مناسب، محصول را از نظر کاربرد آن تعريف مي کند. در مورد يک آزمايش، قابليت اطمينان مثالي از يک معيار بروني است. به عنوان مثال، اگر برنامه اي مي بايست با قابليت اطمينان 99/9%مورد آزمايش قرار گيرد، بعيد است که کاربردها واقعاً با مشکلي مواجه شوند.معيار دروني به مشخصه هايي باز مي گردد که به طور مستقيم از يک محصول مصنوعي شناسايي مي گردد. به عنوان مثال، پوشش کد(code coverage)که بنيانگر آن است تا هر خط کد در يک سيستم نرم افزاري مورد آزمون قرار گيرد، مثالي ازيک معيار ارزيابي دروني است.
متأسفانه ارزيابي خارجي يک مسأله اجرايي را در مديريت مطرح مي کند، زيرا آنها تا زماني که محصول مورد استفاده قرار نگيرند، قابل بررسي نيستند. در مورد مهندسي معکوس، کاربردها(مصرف ها)تعيين کننده هاي خارجي کليدي هستند، اما قادر نيستيم اين مصارف را در زماني که مهندسي معکوس را انجام مي دهيم اندازه گيري و يا حتي پيش بيني کنيم. از اين رو اميد داريم معيار دروني در مديريت فرايند مهندسي معکوس، کمک کننده باشد. دو معيار متناسب دروني«تماميت»و«دقت»هستند. يک تجسم وقتي کامل بودنش کافي است که قادر باشد به طور خودکار براي بازسازي يک برنامه مشابه با نمونه اصلي، مورد استفاده قرار گيرد. علاوه برتماميت، نياز به ارزيابي داريم که محدوده اي را مشخص کند، تا يک تصوير در آن، طرح نرم افزار و ارتباط بين نرم افزار و اهدافي که براي اجرا شدن طرح، مطرح شده اند را توضيح دهد.
حدي را که اين ارزياب براي يک تصوير فراهم مي کند، دقت مي گوييم. براي تماميت نياز به يک مولد کد(code generator)خودکار است تا توانايي براي توليد يک تصوير و تبديل آن به برنامه هاي مشابه يا برنامه اصلي وجود داشته باشد. براي ارزيابي دقت، از مدلي براي دامنه کاربردي برنامه استفاده مي کنيم. دامنه هاي کاربردي، مجموعه هاي کامل و منسجمي از کاربردهايي هستند که توسط يک واژه نامه، ادبيات و معماري معمول مشخص شده اند.

ابزار کار مهندسي معکوس
 

يکي از راحل هاي مشکل درک و فهم برنامه ها، استفاده از ابزار مهندسي معکوس است. روش هاي موفقيت آميز مهندسي معکوس بايد انعطاف پذير و مقياس پذير باشند. بسياري از ابزار مهندسي معکوس مي توانند تجزيه و تحليل، استخراج، سازماندهي، بازنمايي و تکنيک هاي انتخابي را ارائه دهند که برخي از آنها جزو برنامه ها و روش هاي برنامه ريزي اين مهندسي محسوب مي شود و بسياري از اين روش ها و متدهاي اصلي و بنيادي نيز در سيستم هاي طراحي بيان شده است. محيط در واقع قادر است با استفاده از روش هاي برنامه ريزي شده و انتقال اين روش هاي خود کار و نيمه خودکار مهندسي معکوس و جايگزين آنها با يکديگر، بسياري از مشکلات را رفع کرده و اين ساختارها را مورد حمايت خود قرار دهد.
متأسفانه سيستم هايي وجود دارند که طبقه بندي آنها داراي استثنائات فراواني مي باشد. بدون داشتن اطلاعات مورد نياز در مورد برنامه هايي نمي توان اين برنامه ها را شناسايي کرد و تشخيص داد. بنابراين پرسنل و اطلاعات بسيار زيادي لازم است تا بتوان به نکات و مشکلات خاص معماري و طراحي داخلي سيستم هاي بزرگتر پي برد.يکي از روش ها، فرآيند مهندسي معکوس است که اطلاعات طراحي را در بر دارد که از سيستم هاي نرم افزاري منشاء گرفته اند و اين اطلاعات براي گسترش و رشد پروژه هاي مهندسي مجدد و مديريت طرح به کار برده مي شود. اين فرآيند همچنين داراي سيستم هاي انتزاعي و پيچيده اي است که با استفاده از مطالعه ساختارها و سيستم هاي کلي مي تواند اين مشکلات و پيچدگي هاي را حل کند. محيط ها، ساختارها و ابزارهاي مهندسي معکوس تأثير بسزايي در استفاده از برنامه هاي خاص دارند.
يکي از اهداف اصلي مهندسي معکوس تغيير منطقي يک برنامه توسط تغيير ساختار آن است که در اصطلاح به «وصله کردن»معروف است و به طور کلي مفهوم آن اين است که يک برنامه از سطح بالاي بازنمايي کد به يک سطح بازنمايي مياني کامپايل مي شود. لازم به ذکر است، کد توليد شده جديد دقيقا در جاي کد اصلي قرار گيرد. وصله کردن اجازه مي دهد ما کد موجود را تغيير دهيم، حذف کنيم و يا به آن اضافه نماييم.
معمولاً بازنمايي مياني در قالب يک زبان مونتاژ است. اين بازنمايي مياني در نهايت به شکل باينري ماشين تغيير پيدا مي کند. در طول مهندسي معکوس کد باينري قابل اجرا به زبان مياني بر مي گردد و اگر نياز بود به کد برنامه سطح بالا تغيير شکل خواهد داد. اين سؤال پيش مي آيد که همه اين کارها چطور انجام مي شود؟ چهار نوع ابزار براي انجام اين مراحل وجود دارد که به توضيح آنها خواهيم پرداخت. جزئيات مرحله پياده سازي در شکل 3 نشان داده شده است.

الف)اشکال زدا
 

همه با اشکال زداها(Debugger)آشنا هستند و آنها را به عنوان رفع کننده عيب برنامه ها مي شناسند. يک اشکال زدا در حقيقت يک برنامه نرم افزاري است که برنامه ها ديگر را خط به خط و مرحله به مرحله اجرا مي کند و قادر است خطاهاي آنها را رديابي کند و به عبارتي به عنوان پيدا کننده خطاها(Bug)در برنامه ها معرفي مي شود. نحوه عملکرد آن هم به اين صورت است که ابتدانقاط توقف (Breakpoint)را در مکان هاي درخواستي يک برنامه مي گذارد و سپس آن را اجرا مي کند، وقتي خط اجرا به اين نقاط مي رسد، متوقف مي شود و کاربر مي تواند وضعيت يا به عبارتي ارزش متغيرها را در حين اجراي گام به گام مشاهده کند.
اشکال زداها به دو دسته عمده تقسيم مي شوند: يکي مد کاربر(user)و ديگري مد هسته(kernel)اشکال زدايي هاي(Debug)مد کاربر مانند يک برنامه معمولي تحت سيسيتم عامل و تحت فرمان همان قوانين برنامه هاي عادي اجرا مي شوند. آنها تنها پروسه سطح کاربر را اشکال زدايي مي کنند، درصورتي که مد هسته قسمتي از سيستم عامل است که برنامه هاي راه انداز سيستم و حتي خود مهندسي عامل را رفع عيب مي کند. يک مثال براي مد هسته softiceاست.
يک متد که در مهندسي معکوس به کار گرفته مي شود اين است که براي سرعت بخشيدن به کار از عمل چک کردن ورودي هاي کاربر استفاده مي شود. يعني به جاي اينکه همه مسير چک شود، به کمک نقطه توقف، مکان ورودي چک شود و مکان ورودي جايي است که کاربر داده اش را به برنامه مي دهد. حتي مکان ورودي را مي توان به صورت يک مرحله مجزا در برنامه چک کرد.

ب)ابزار تزريق عيب(fault injection)
 

ابزار تزريق عيب است که عيب ها را در داخل کد، براي مشاهده رفتار غير عادي تزريق مي کند. اين رفتار ممکن است اطلاعات مفيدي براي مهندسي معکوس آشکار سازد. اين واقعاً يک نوع تکنيک تست مهندسي نرم افزار که شامل خطوطي از تکه هاي خطا مي باشد.

پ)دي اسمبلر(Disassembler)
 

فورمت يک فايل اجرايي، باينري است، بنابراين کاربر قادر به درک ساختار فايل نيست. همچنين هر فايل exe يا فايل اجرا عموماً توسط کميته نرم افزاري کمپاني هايي شبيه ميکروسافت، IBM وAT&Tدر فورمت مهندسي معکوس تعيين مي شوند که اين براي فايل هاي exe يک فورمت استاندارد است.برنامه هاي دي اسمبل اولين بار توسط رخنه کننده ها(cracker)نوشته شد. يک دي اسمبلر فايلي با ساختار باينري(کد ماشين)را به زبان سطح بالاتر خود(کد اسمبلي)تبديل و ترجمه مي کند که اين برنامه اسمبلي داراي ميليون ها يا حتي تعداد بيشتري خط دستور مي باشد و به همين دليل ممکن است براي بسياري از خوانندگان آن قابل فهم و درک نباشد. در حقيقت اين کار عکس عمل اسمبلر(Assembler)است و به نوعي مهندسي معکوس محسوب مي شود.
عمدتاً کد برنامه زبان اسمبلي اجازه مي دهد، از ثابت هاي سمبوليک و توضيحات برنامه نويس استفاده شود. معمولاًاينها از کد ماشين توليد شده توسط اسمبلر حذف شده است. پس بنابراين يک عمليات دي اسمبلر در يک کد ماشين کمبود اين ثابت ها و توضيحات را که به طور مجزا بايد توليد شوند، تأمين خواهد کرد. برخي از دي اسمبلرها مي توانند به نام ها و توضيحات مفيدي اشاره کنند و تعداد زيادي از آنها مي توانند از اطلاعات رفع عيب شده سمبوليک موجود در فايل هاي موضوعي مانند ELFاستفاده کنند. تعدادي ديگر از آنها مانند دي اسمبلرهاي فعل و انفعالي (محاوره اي)واقعاًبه کاربر انساني اجازه مي دهند، سمبول هاي يادآور شده را براي مقادير يا بخشي از يک کد در يک دوره محاوره اي بسازد.
در ادامه بايدافزود که برخي اوقات مقايسه دو کد دي اسمبل شده خيلي سخت است. امروزه دي اسمبلر با نام تجاري مشترک افزار (Shareware)و آزاد افزار(freeware)در دسترس است. تعدادي از ابزارهايي که ساخته شده اند، به خوبي عمل دي اسمبلر را بر روي خودشان هم انجام مي دهند که به عنوان مثال از اين دسته مي توان دو محصول تجاري IDApro وIDAsource را نام برد.IDA براي ماهرانه استفاده کردن از پايگاه داده برنامه، API را به کار مي گيرد تا کاربر بتواند تحليل سفارشي انجام بدهد.

ت)دي کامپايلر(Decompiler)
 

دي کامپايلر نام يک برنامه رايانه اي است که عمل معکوس کامپايلر را انجام مي دهد و کد ماشين يا کد اسمبلي مياني را به کد برنامه سطح بالايي تبديل مي کند. هدف دي کامپايلر اين است که فايل حاوي اطلاعاتي که توسط رايانه قابل خوانده شدن است را ترجمه کند تا توسط انسان نيز قابل خواندن باشد. اين جمله معمولاً بيشتر براي ترجمه برنامه اجرايي از کد مبدأ به سطح بالا به کار مي رود،به طوري که همان کارايي برنامه اجرايي اصلي را داشته باشد.همچنين خروجي آن براي بازيافت کد برنامه، امنيت رايانه، تصحيح خطا و قابليت استفاده متقابل بکار مي رود.هدف از عمل دي کامپايل به ميزان دسترسي اطلاعات در کد عرضه شده که در حال دي کامپايل شدن است، بستگي دارد و پيچيدگي در تحليل کارايي مثل کد بايت به کار رفته در تعداد زيادي از ماشين هاي مجازي شامل متاديتا و با سطح بالايي از خصيصه است، که عمل دي کامپايل مناسب تري را فراهم مي سازد.REC نرم افزاري براي دي کامپايل کردن است که به طور وسيع در لايه زيرين رايانه، شماي حفاظت از کپي را مي شکند.

آناليزها و تست هاي مهندسي معکوس
 

آناليزهاي مهندسي معکوس به طور کلي به سه دسته تقسيم مي شوند. کدبرنامه بعضي وقت ها در دسترس است وبرخي مواقع غير قابل دسترس مي با شد. تست جعبه سياه و جعبه سفيد و نيز آناليز هر دو اين متدها، سعي در فهم نرم افزار دارند. اگر تحليلگر به کد برنامه دسترسي داشته باشد، آنها شيوه هاي متفاوتي را به کار مي گيرند. با وجود اين متد بايد نواحي کليدي متعددي را که به علت ضعف در نرم افزار مورد حمله مهاجمان قرار گرفته اند، مورد بررسي قرار داده و عيب هاي آنها را پيدا کرد.
1-توابع چک کننده نامناسب ونامحدود.
2-توابعي که داده هاي تهيه شده کاربر را به فورمت رشته پاس مي دهند.
3-توابعي که قصد دارند محدوده چک کردن را در يک فورمت رشته تقويت کنند.
4-بطور روتين ورودي کاربر بکار رفته در يک حلقه را مي گيرد.
5-پوينترهاي حسابي کاربر بافر روتين ها را تأمين مي کند.
6-سيستمي که داده هاي ديناميکي را مي گيرد، سيستم مطمئن ناميده مي شود.

الف)آناليز و تست جعبه سفيد (White-box)
 

منظور از آناليز جعبه سفيد، تجزيه و تحليل و درک کد برنامه بدون اجرا کردن آن است. به هر حال بعضي اوقات ما نياز به کد باينري داريم، اما وقتي يک کد باينري را براي به دست آوردن کدبرنامه و مطالعه آن دي کامپايل مي کنيم در واقع يک نوع آناليز جعبه سفيد انجام مي گيرد. اما تست جعبه سفيد براي پيدا کردن خطاهاي پياده سازي و برنامه نويسي در نرم افزار به کار مي رود.برخي از حالت هاي اين فعاليت با تطبيق دهنده الگو برابر است، حتي با تحليلگر استاتيک خودکار مي شود. با اين وجود به کارگيري متد تحليل استاتيک بر روي کد برنامه، روش خوبي براي بهره برداري برخي از انواع نرم افزاراست.
تحليل هاي استاتيک با بهره گيري از فايل هاي برنامه، مانند ورودي و خروجي مورد استفاده قرار مي گيرند. اين ورودي وخروجي ها مي توانند داده هاي استاتيکي باشند که مشخصه برخي از کدها هستند. اين آزمايش کننده است که ورودي هاي وضعيت آزمايش را انتخاب مي کند و اين کار را بابکارگيري مسيرها به کمک کد انجام مي دهد و خروجي هاي مناسب را تعيين مي کند.
تست جعبه سفيد(تست جعبه پاک، تست جعبه شيشه اي يا تست ساختاري)يک پرسپکتيو داخلي از سيستم را براي طراحي حالت هاي آزمايشي بر پايه ساختار داخلي آن به کار مي برد و اين نيازمند مهارت هاي برنامه نويسي است تا همه مسيرها را به وسيله نرم افزار شناسايي نمايد. اين نوع تست قادر است آسيب ها و ضعف هاي بالقوه اي را که وجود ندارند گزارش کند. انواع تکنيک هاي طراحي تست جعبه سفيد به دو صورت آزمايش جريان داده وآزمايش جريان کنترل مي باشند.
IDA pro که ابزار خودکار در زمينه دي کامپايل کردن کد باينري به کد برنامه است، يک آناليز جعبه سفيد است که همچنين اين ابزار براي تحليل امنيت مفيد است.
جعبه سفيد حتي در سخت افزار نيز کاربرد دارد. براي مثال در يک سخت افزار الکتريکي، آزمايش هرند در يک مدار شايد به دقت بررسي و حساب شده باشد که به عنوان مثال مي توان از يک آزمايش کننده مدار(ICT)نام برد. از وقتي آزمايش ها بر پايه پياده سازي واقعي هستند، اگر پياده سازي تغيير کند، آزمايش ها و تست ها احتمالاًبه هم نياز خواهند داشت. براي مثال در آزمايش کننده مدار اگر مقادير قطعات تغير کند، لازم است به روز رساني انجام شود، ولي اگر مدار تغيير کند نياز است که يا قطعات ثابت آن تعويض و يا قطعات جديدي به آن اضافه شود. اين مسأله براي پروسه تغيير بار مالي دارد، بنابراين محصولات خطادار ممکن است خطا دار بمانند. واحد بازرسي نوري اتوماتيک(AOI)پيشنهاد مي کند که ميزان درستي قطعه مشابه بدون در نظر گرفتن هزينه قطعات ثابت آزمايش کننده مدار بررسي شود، هر چند که هنوز تغييرات نياز دارند که آزمايش به روز انجام شود. تا زماني که آزمايش جعبه سفيد در واحد قابل اجرا باشد، سطوح مجتمع و سيستم پروسه آزمايش نرم افزار معمولاً به واحد مربوط مي شود.

ب)آناليز و تست جعبه سياه (Black-box)
 

آناليز جعبه سياه يک برنامه اجرايي را با پرسش از قسمت هاي گوناگون آن مورد تجزيه و تحليل قرار مي دهد. اين نوع آناليز تنها نياز به يک برنامه اجرايي دارد و با آناليز کد برنامه کاري ندارد. آناليز جعبه سياه در شناختن نواحي کشف شده آناليز جعبه سفيد کمک مي کند. البته قابل ذکر است، آناليز جعبه سياه، اول اجرا مي شود.
تست جعبه سياه تشکيل شده است از آزمايش رفتار خارجي يک برنامه براساس ورودي هايي که به آن داده مي شود. در حقيقت اين نوع تست که به آزمايش عملکرد نيز معروف است، امتحان مي کند که يک برنامه بدون توجه به چگونگي انجام کارهاي داخلي خود چطور اجرا مي شود و به چه شکلي به پايان مي رسد. اين تست شايد بدون دسترسي به کد باينري نيز ممکن باشد. همچنين يک برنامه مي تواند بر روي شبکه نيز تست شود. يک تست جعبه سياه به خاطر محدوديت هاي تئوريکي نمي تواند به طور عمقي در فضاي ورودي يک برنامه براي مشکلات جستجو کند، اما نسبت به نرم افزار هدف همانند يک حمله کنند حقيقي در يک محيط عملياتي واقعي رفتار مي کند و کار را در يک سيستم زنده انجام مي دهد.

پ)آناليز و تست جعبه خاکستري (Gray-box)
 

آناليز جعبه خاکستري ترکيبي از آناليز جعبه سياه و آناليز جعبه سفيد است.براي نمونه قطعات کد تو درتو مي توانند در يک روش جعبه سياه عمل کنند و سپس بعد از تقسيم بندي بيشتر قطعات مي توانند به داخل آناليز جعبه سفيد هدايت شوند. يک مثال خوب براي تجزيه کردن جعبه خاکستري، برنامه اي است که در برنامه اي در داخل اشکال زدا اجرا مي شود و مجموعه اي از ورودي ها را براي اين برنامه به کار مي گيرد. در اين زماني که اشکال زدا خطاها و خرابي ها را کشف مي کند، برنامه وارسي مي شود. يک نرم افزار که مي تواند جزئيات آناليز زمان اجرا را با تمرکز بر روي حافظه به کار رفته ومصرفي تهيه کند، نرما فزار Rational purify نام دارد. آن همچنين وقتي مشکل از کنترل خارج مي شود، برايc و++cمهم است. مثالي ديگر از اشکال زدا که آناليز زمان را تأمين مي کندو براي لينکوس به کار مي رود Valgrindنام دارد. مهم روش هاي تست کردن مي توانند احتمال خطرات نرم افزار و احتمال بهره وري آن را نشان مي دهند.

مفهوم پوشش کد
 

پوشش کد از روش هاي مهم و اصلي در مهندسي معکوس است، کمک مي کند مسيرهاي منطقي پيموده شده و يا نشده معلوم گردند. در حقيقت اين متد با ديدن اجراي برنامه و چک کردن مسيرهاي کد به ساخت يک نقشه از آن مسيرها ياري مي رساند. تعدادي ابزار اين متد وجود دارند. تحليل پوشش کد مي تواند مستقيماً آنچه را که درک نکرده ايم، دريابد که آن يک اندازه گير غير مستقيم کيفيت است. در واقع کيفيت مجموعه تست هاي ما را تضمين مي کند و مي توان آن را جزء تست جعبه سفيد دسته بندي کرد. انواع ديگري از پوشش ها نيز وجود دارند که با کاربردهاي متفاوت خود مفيد واقع مي شوند. پوشش تصميم (Decision Coverage) که معياري براي سنجش در لحظات تصميم گيري با دو حالت Trueو False طي اجراي تست است. پوشش مسير(path Coverage)هر مسير ممکن را که از ابتدا تا انتها پوشيده شده است، اندازه مي گيرد. پوشش تابع (Function Coverage)براي تأييد هر تابعي که در طول مرحله تست به کار گرفته شده است، آن را مورد ارزيابي قرار مي دهد.

نرم افزارهاي مهندسي معکوس
 

امروزه مراحل کار مهندسي معکوس و رو به جلو توسط نرم افزارهايي به طور خودکار و نيمه خوکار انجام مي گيرد که هر کدام خصوصيات خاص خود را دارند. تجارت نرم افزاري و مهندسي اوليه به طور تاريخي داراي رشد و گسترش چشمگيري بوده است و اين مسأله ادامه دارد. تکامل و پيشرفت نرم افزاري نيز بستگي زيادي به تکامل و پيشرفت فرآيندهاي انجام شده دارد و اين باعث ارتقاء سطح کيفي سيستم هاي نرم افزاري و تحقيقاتي مهندسي مي شود. سيستم هاي به کار گرفته شده بسيار منعطف و توسعه پذير مي باشند و مي توانند براي زبان هاي برنامه نويسي مختلف از همه آنها بطور مستقل و به صورت سازمان يافته استفاده کرد و مي توان چنين بيان کرد که بسياري از اين برنامه ها داراي طرح کلي مي باشند که اين طرح داراي سه خصوصيت انعطاف پذيري، توسعه پذيري و دامنه فعاليت آنهاست.
در روشي که براي مهندسي معکوس بيان خواهد شد، انعطاف پذيري و توسعه پذيري و دامنه فعاليت آنهاست.
در روشي که براي مهندسي معکوس بيان خواهد شد، انعطاف پذيري و توسعه پذيري از الزامات کليدي است. اين روش بايد آنقدر انعطاف پذير باشد تا بتوانند نتايج حاصله را به صورت برنامه هاي عملي و متفاوت به مرحله اجرا برساند.
دامنه فعاليت در اين بخش مي تواند متفاوت باشد که از جمله مي توان حوزه بانکداري يا سيستم هاي پايگاه را نام برد. اين دامنه هاي تحقيق شامل زبان پياده سازي کاربردي مي باشند. هدف اين است که 2 تا3 ميليون خط برنامه را در نظر بگيريم که شامل تعداد زيادي از برنامه هاي بازمانده از قديم است. Rigi يکي از همين محيط هاي مهندسي معکوس بوده که داراي هر سه خصوصيت گفته شده مي باشد. همچنين از ديگر نرم افزارهاMoose است.
منبع: ماهنامه اطلاعات علمي-ش363